﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AdmLaboratorios.DTO;
using AdmLaboratorios.Business;

namespace AdmLaboratorios
{
    public partial class frmOPModificacion : Form
    {
        public PartnerDTO Partner { get; set; }
        public ProductoDTO Producto { get; set; }
        public OrdenProduccionDTO Op { get; set; }
        public DataTable items = new DataTable();

        public frmOPModificacion()
        {
            InitializeComponent();
        }

        private void frmOPModificacion_Load(object sender, EventArgs e)
        {
            items = new DataTable();
            items.Columns.Add("IdProducto", typeof(int));
            items.Columns.Add("Producto");
            items.Columns.Add("Cantidad", typeof(decimal));
            items.Columns.Add("Observaciones");
            items.AcceptChanges();

            FillGrid();
            btProducto.Enabled = false;
            grpItems.Enabled = false;
            //btGuardar.Enabled = false;
        }

        private void btPartner_Click(object sender, EventArgs e)
        {
            //using (frmPartnerConsulta f = new frmPartnerConsulta())
            using (frmPartnerConsulta f = new frmPartnerConsulta())
            {
                FormsHelper.CargarColumnasGrilla(f);
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    //CleanControls();
                    this.Partner = f.Partner;
                    txPartner.Text = Partner.Nombre;

                    btProducto.Enabled = true;
                    grpItems.Enabled = true;
                }
            }
        }

        private void CleanControls()
        {
            this.Partner = null;
            this.Producto = null;
            txPartner.Text = string.Empty;
            txProducto.Text = string.Empty;
            gvItems.DataSource = null;
        }

        private void btProducto_Click(object sender, EventArgs e)
        {
            using (frmProductoSeleccionOP f = new frmProductoSeleccionOP())
            {
                f.Partner = this.Partner;
                FormsHelper.CargarColumnasGrilla(f);
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    //CleanControls();
                    this.Producto = f.Producto;
                    txProducto.Text = string.Format("{0} [{1}] | {2}",
                        this.Producto.Nombre,
                        this.Producto.Codigo,
                        this.Producto.Tipo);
                }
            }
        }

        private void picProductoDetalle_Click(object sender, EventArgs e)
        {
            if (this.Producto != null)
            {
                using (frmProductoDetalle f = new frmProductoDetalle())
                {
                    f.Producto = this.Producto;
                    FormsHelper.CargarColumnasGrilla(f);
                    f.ShowDialog();
                }
            }
            else
            {
                MessageBox.Show("Debe seleccionar un Producto para poder ver su detalle.",
                    "Detalle de Partner", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void picPartnerDetalle_Click(object sender, EventArgs e)
        {
            if (this.Partner != null)
            {
                using (frmPartnerDetalle f = new frmPartnerDetalle())
                {
                    f.Partner = this.Partner;
                    FormsHelper.CargarColumnasGrilla(f);
                    f.ShowDialog();
                }
            }
            else
            {
                MessageBox.Show("Debe seleccionar un Partner para poder ver su detalle.",
                    "Detalle de Partner", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }



        private void btCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (Validar())
                {
                    if (gvItems.RowCount == 0)
                    {
                        if (MessageBox.Show("Está a punto de guardar la OP sin Items. ¿Desea continuar de todos modos?",
                            "OP sin Items", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == System.Windows.Forms.DialogResult.No)
                            return;
                    }

                    OP op = BuildOP();
                    op = OrdenesProduccion.Modificar(op);

                    MessageBox.Show("Se guardó la OP exitosamente",
                        "Guardar OP", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    this.Close();
                }
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }


        }

        private OP BuildOP()
        {
            OrdenProduccionDTO cabecera = FillOP();
            List<OrdenProduccionItemDTO> items = FillItems();

            OP op = new OP();
            op.Items = items;
            op.OrdenProduccion = cabecera;

            return op;
        }

        private List<OrdenProduccionItemDTO> FillItems()
        {
            List<OrdenProduccionItemDTO> itemsList = new List<OrdenProduccionItemDTO>();

            foreach (DataRow row in items.Rows)
            {
                OrdenProduccionItemDTO item = new OrdenProduccionItemDTO();
                item.Id = 0;
                item.IdOrdenProduccion = 0;
                item.Cantidad = (decimal)row["Cantidad"];
                item.CantidadCorregida = (decimal)row["Cantidad"];
                item.CoeficienteCorreccion = 1;
                item.IdProducto = (int)row["IdProducto"]; ;
                item.Obs = row["Observaciones"].ToString();
                item.Activo = true;
                item.IdStock = null;

                itemsList.Add(item);
            }

            return itemsList;
        }

        private OrdenProduccionDTO FillOP()
        {
            //OrdenProduccionDTO op = new OrdenProduccionDTO();
            Op.IdPartner = this.Partner.Id;
            Op.IdProducto = this.Producto.Id;
            Op.Fecha = dt.Value;
            Op.Cantidad = FormsHelper.StN(txCantidad.Text);
            
            Op.NumeroLote = txNumeroLote.Text;
            Op.NumeroOP = txNumeroOP.Text;
            Op.Obs = txObs.Text;
            Op.ObsImpresion = txObsImpresion.Text;
            Op.ArchivoPDF = null;

            if (rbActiva.Checked)
            {
                Op.Estado = eOrdenProduccionEstado.ACTIVA.ToString();
                Op.Activo = true;
            }

            if (rbCancelada.Checked)
            {
                Op.Estado = eOrdenProduccionEstado.CANCELADA.ToString();
                Op.Activo = false;
            }

            if (rbFinalizada.Checked)
            {
                Op.Estado = eOrdenProduccionEstado.FINALIZADA.ToString();
                Op.Activo = false;
            }
               
            return Op;
        }

        private bool Validar()
        {
            errP.Clear();

            if (string.IsNullOrEmpty(txPartner.Text) || string.IsNullOrWhiteSpace(txPartner.Text))
            {
                errP.SetError(picPartnerDetalle, "Se debe seleccionar un Partner.");
                return false;
            }
            if (string.IsNullOrEmpty(txProducto.Text) || string.IsNullOrWhiteSpace(txProducto.Text))
            {
                errP.SetError(picProductoDetalle, "Se debe seleccionar un Producto.");
                return false;
            }
            if (string.IsNullOrEmpty(txNumeroOP.Text) || string.IsNullOrWhiteSpace(txNumeroOP.Text))
            {
                errP.SetError(txNumeroOP, "Se debe escribir un número de OP.");
                return false;
            }
            return true;
        }

        private void btEdit_Click(object sender, EventArgs e)
        {
            if (gvItems.SelectedRows.Count == 1)
            {
                using (frmOPItem f = new frmOPItem())
                {
                    f.Partner = this.Partner;
                    f.FillControls(
                        Productos.Get((int)gvItems.SelectedRows[0].Cells["IdProducto"].Value),
                        (decimal)gvItems.SelectedRows[0].Cells["Cantidad"].Value,
                        (string)gvItems.SelectedRows[0].Cells["Observaciones"].Value);

                    FormsHelper.CargarColumnasGrilla(f);
                    if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        gvItems.SelectedRows[0].Cells["IdProducto"].Value = f.Item.IdProducto;
                        gvItems.SelectedRows[0].Cells["Producto"].Value = f.Producto.Nombre;
                        gvItems.SelectedRows[0].Cells["Cantidad"].Value = f.Item.Cantidad;
                        gvItems.SelectedRows[0].Cells["Observaciones"].Value = f.Item.Obs;
                    }
                }
            }
        }

        private void btAdd_Click(object sender, EventArgs e)
        {
            using (frmOPItem f = new frmOPItem())
            {
                f.Partner = this.Partner;
                FormsHelper.CargarColumnasGrilla(f);
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    items.Rows.Add(f.Item.IdProducto,
                        f.Producto.Nombre,
                        f.Item.Cantidad,
                        f.Item.Obs);
                    lbItemsCount.Text = gvItems.RowCount.ToString();
                }
            }
        }

        private void FillGrid()
        {
            gvItems.DataSource = null;
            gvItems.DataSource = items;
            lbItemsCount.Text = items.Rows.Count.ToString();
        }

        private void btRemove_Click(object sender, EventArgs e)
        {
            if (gvItems.SelectedRows.Count == 1)
            {
                if (MessageBox.Show("¿Está seguro de que desea quitar el item seleccionado?",
                    "Quitar Item", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    items.Rows.Remove(
                        ((DataRowView)gvItems.SelectedRows[0].DataBoundItem).Row);
                    lbItemsCount.Text = gvItems.RowCount.ToString();
                }
            }
        }


        private void gvItems_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            btEdit_Click(sender, e);
        }

        internal void SetValues(int idOP)
        {
            Op = OrdenesProduccion.GetOp(idOP);

            dt.Value = Op.Fecha;

            this.Partner = Partners.Get(Op.IdPartner);
            if (this.Partner != null)
                txPartner.Text = this.Partner.ToString();

            
            this.Producto = Productos.Get(Op.IdProducto);
            if (this.Producto != null)
                txProducto.Text = this.Producto.ToString();

            txNumeroOP.Text = Op.NumeroOP;
            txNumeroLote.Text = Op.NumeroLote;
            txCantidad.Text = Op.Cantidad.ToString(FormsHelper.formatoMonto);

            if (Op.Estado == eOrdenProduccionEstado.ACTIVA.ToString())
                rbActiva.Checked = true;
            if (Op.Estado == eOrdenProduccionEstado.CANCELADA.ToString())
                rbCancelada.Checked = true;
            if (Op.Estado == eOrdenProduccionEstado.FINALIZADA.ToString())
                rbFinalizada.Checked = true;

            txObs.Text = Op.Obs;
            txObsImpresion.Text = Op.ObsImpresion;
            
            //---
            this.items.Rows.Clear();
            foreach (OrdenProduccionItemDTO i in OrdenesProduccion.GetItems(idOP))
            {
                items.Rows.Add(
                    i.IdProducto,
                    Productos.Get(i.IdProducto).Nombre,
                    i.Cantidad,
                    i.Obs);
            }

            lbItemsCount.Text = items.Rows.Count.ToString();

            grpEstado.Enabled = true;
            grpItems.Enabled = true;
            btGuardar.Enabled = true;
        }

        private void btIRSinOp_Click(object sender, EventArgs e)
        {
            using (frmIRSinOPSeleccion f = new frmIRSinOPSeleccion())
            {
                f.Op = this.Op;
                FormsHelper.CargarColumnasGrilla(f);
                f.ShowDialog();
            }
        }
    }
}
